﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace XtremBiking.Web.Controllers
{
    public class UserController : Controller
    {
        //
        // GET: /Usuarios/
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Administrador)]
        public ActionResult Index()
        {
            List<XtremBiking.Logica.DTO.Usuario> usuariosDto = XtremBiking.Logica.Usuarios.ListAllUsers();
            List<Models.Usuarios.ViewUsers> listaUsuarios = null;
            Models.Usuarios.ViewUsers usuario = null;

            if (usuariosDto != null)
            {
                listaUsuarios = new List<Models.Usuarios.ViewUsers>();
                foreach (XtremBiking.Logica.DTO.Usuario item in usuariosDto)
                {
                    usuario = new Models.Usuarios.ViewUsers()
                    {
                        IdUsuario = item.IdUsuario,
                        Apellidos = item.Apellidos,
                        Mail = item.Mail,
                        Nombre = item.Nombre,
                        NivelUsuario = item.Nivel,
                        PerfilUsuario = item.Perfil
                    };
                    
                    listaUsuarios.Add(usuario);
                }
            }
            return View(listaUsuarios);
        }

        //
        // GET: /Usuarios/Details/5
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Administrador)]
        public ActionResult Details(int id)
        {
            //OBTENER LA FICHA DEL USUARIO SELECCIONADO.
            return View();
        }

        //
        // GET: /Usuarios/Create
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Administrador)]
        public ActionResult Create()
        {
            Models.Usuarios.CreateUser model = new Models.Usuarios.CreateUser();
            model.NivelUsuario = new Logica.Enumerados.Usuarios.Nivel();
            model.PerfilUsuario = new Logica.Enumerados.Usuarios.Perfil();
            return View(model);
        }

        //
        // POST: /Usuarios/Create

        [HttpPost]
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Administrador)]
        public ActionResult Create(Models.Usuarios.CreateUser model, FormCollection collection)
        {
            try
            {
                model.NivelUsuario = (XtremBiking.Logica.Enumerados.Usuarios.Nivel)int.Parse(collection["NivelUsuario"].ToString());
                model.PerfilUsuario = (XtremBiking.Logica.Enumerados.Usuarios.Perfil)int.Parse(collection["PerfilUsuario"].ToString());

                XtremBiking.Logica.DTO.Usuario modelo = new Logica.DTO.Usuario()
                {
                    Apellidos = model.Apellidos,
                    Mail = model.Mail,
                    Nivel = (Logica.Enumerados.Usuarios.Nivel)Enum.Parse(typeof(Logica.Enumerados.Usuarios.Nivel),collection["NivelUsuario"]),
                    Nombre = model.Nombre,
                    Perfil = (Logica.Enumerados.Usuarios.Perfil)Enum.Parse(typeof(Logica.Enumerados.Usuarios.Perfil), collection["PerfilUsuario"])
                };

                if (XtremBiking.Logica.Usuarios.RegistrarUsuario(modelo))
                {
                    TempData["Message"] = XtremBiking.Recursos.Controladores.Usuarios.MensajeRegistroOK;
                    return RedirectToAction("Index", "Home");

                }
                else
                {
                    return View(model);
                }
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Usuarios/Edit/5
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Administrador)]
        public ActionResult Edit(int id)
        {
            return View();
        }

        //
        // POST: /Usuarios/Edit/5
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Administrador)]
        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add update logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Usuarios/Delete/5
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Administrador)]
        public ActionResult Delete(int id)
        {
            return View();
        }

        //
        // POST: /Usuarios/Delete/5
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Administrador)]
        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        public ActionResult EmailAvailable(string Mail)//, string currentEmail
        {
            return Json(XtremBiking.Logica.Usuarios.EmailAvailable(Mail, null), JsonRequestBehavior.AllowGet);
        }


        #region ChangePassword
        /// <summary>
        /// Method responsible for processing the get request to change backoffice user password
        /// </summary>
        /// <returns>Returns a View to Edit Users</returns>
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Usuario)]
        public ActionResult ChangePassword()
        {
            XtremBiking.Web.Models.Usuarios.UserChangePassword model = new Models.Usuarios.UserChangePassword();
            return View(model);
        }
        #endregion

        #region ChangePassword POST
        /// <summary>
        /// Method responsible for processing POST request to change backoffice user password
        /// </summary>
        /// <param name="model">Object of type PresentationModels.Users.UserChangePasswordPresentation containing all data for the user to change the password</param>
        /// <returns>Redirect to ChangePassword Action</returns>
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Usuario)]
        [HttpPost]
        public ActionResult ChangePassword(XtremBiking.Web.Models.Usuarios.UserChangePassword model)
        {
            try
            {
                // get the company ID of the logged user to filter the users that can be deployed on the grid.
                if (ModelState.IsValid)
                {
                    String[] s = User.Identity.Name.Split(new Char[] { '#' });
                    Int32 userId = int.Parse(s[0]);

                    //Phoenix.Facade.BackOffice.Users.ChangeUserPassword(userId, model, Request.UserHostAddress);
                    XtremBiking.Logica.DTO.UserChangePassword modeloDTO = new Logica.DTO.UserChangePassword() 
                    {
                        IdUsuario = userId,
                        CurrentPassword = model.CurrentPassword,
                        NewPassword = model.NewPassword
                    };
                    
                    XtremBiking.Logica.Usuarios.ChangeUserPassword(modeloDTO);
                    TempData["Message"] = XtremBiking.Recursos.Controladores.Usuarios.ChangePasswordSucess;
                }

                return View();

            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
            }
            return View(model);
        }
        #endregion

        #region FirstLogin
        /// <summary>
        /// Method responsible for processing the get request to change backoffice user password
        /// </summary>
        /// <returns>Returns a View to Edit Users</returns>
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Usuario)]
        public ActionResult FirstLogin()
        {
            return View();
        }
        #endregion

        #region FirstLogin POST
        /// <summary>
        /// Method responsible for processing POST request to change backoffice user password
        /// </summary>
        /// <param name="model">Object of type PresentationModels.Users.UserChangePasswordPresentation containing all data for the user to change the password</param>
        /// <returns>Redirect to ChangePassword Action</returns>
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Usuario)]
        [HttpPost]
        public ActionResult FirstLogin(XtremBiking.Web.Models.Usuarios.UserChangePassword model)
        {
            try
            {

                // get the company ID of the logged user to filter the users that can be deployed on the grid.
                if (ModelState.IsValid)
                {

                    if (ModelState.IsValid)
                    {
                        String[] s = User.Identity.Name.Split(new Char[] { '#' });
                        Int32 userId = int.Parse(s[0]);

                        XtremBiking.Logica.DTO.UserChangePassword modeloDTO = new Logica.DTO.UserChangePassword()
                        {
                            IdUsuario = userId,
                            CurrentPassword = model.CurrentPassword,
                            NewPassword = model.NewPassword
                        };

                        XtremBiking.Logica.Usuarios.ChangeUserPassword(modeloDTO);
                        TempData["Message"] = XtremBiking.Recursos.Controladores.Usuarios.ChangePasswordSucess;
                    }
                    //si el usuario tiene perfil de usuario entonces
                    //llamar a vista que complete la ficha del usuario
                    return RedirectToAction("Index", "Home");

                    

                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
            }
            return View(model);
        }
        #endregion

        #region Personal Info
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Usuario)]
        public ActionResult PersonalInfo() 
        {   
            String[] s = User.Identity.Name.Split(new Char[] { '#' });
            Int32 userId = int.Parse(s[0]);
            XtremBiking.Web.Models.Usuarios.PersonalInfo model = null;
            XtremBiking.Logica.DTO.PersonalInfo personalInfo = XtremBiking.Logica.Usuarios.GetPersonalInfo(userId);

            if (personalInfo != null)
            {
                model = new Models.Usuarios.PersonalInfo()
                {
                    Altura = personalInfo.Altura,
                    Celular = personalInfo.Celular,
                    Competencias = personalInfo.Competencias,
                    Direccion = personalInfo.Direccion,
                    Documento = personalInfo.Documento,
                    FechaNacimiento = personalInfo.FechaNacimiento,
                    IdUsuario = personalInfo.IdUsuario,
                    KmsRecorridos = personalInfo.KmsRecorridos,
                    Peso = personalInfo.Peso,
                    PorQueCiclismo = personalInfo.PorQueCiclismo,
                    PulsoBasal = personalInfo.PulsoBasal,
                    PulsoMaximo = personalInfo.PulsoMaximo,
                    Telefono = personalInfo.Telefono
                };
            }
            else 
            {//se carga la ficha por primera vez
                model = new Models.Usuarios.PersonalInfo()
               {
                   IdUsuario = userId
               };
            }
            return View(model);
        }

        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
            System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

            //System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("es-UY");
            //System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("es-UY");
        }

        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Usuario)]
        [HttpPost]
        public ActionResult PersonalInfo(XtremBiking.Web.Models.Usuarios.PersonalInfo model, FormCollection collection)
        {
            
            try
            {

                decimal altura = Convert.ToDecimal(Request["Altura"].ToString());
                double peso = Convert.ToDouble(Request["Peso"].ToString());
                //model.Altura.ToString().Replace(".",",");// = Convert.ToDecimal(Request["Altura"].ToString());
                //model.Peso.ToString().Replace(".",",");// = Convert.ToDecimal(Request["Altura"].ToString());
                //int time = Convert.ToInt32(Request["txtYear"].ToString());
               
                    //if (ModelState.IsValid)
                    //{
                        String[] s = User.Identity.Name.Split(new Char[] { '#' });
                        long userId = long.Parse(s[0]);

                        XtremBiking.Logica.DTO.PersonalInfo modeloDTO = new Logica.DTO.PersonalInfo()
                        {
                            IdUsuario = userId,
                            Altura = float.Parse(collection["Altura"].ToString().Replace(".",",")),
                            Celular = model.Celular,
                            Competencias = model.Competencias,
                            Direccion = model.Direccion,
                            Documento = model.Documento,
                            FechaNacimiento = model.FechaNacimiento,
                            KmsRecorridos = Convert.ToInt32(Request["KmsRecorridos"].ToString()),
                            Peso = float.Parse(collection["Peso"].ToString().Replace(".", ",")),
                            PorQueCiclismo = model.PorQueCiclismo,
                            PulsoBasal = Convert.ToInt32(Request["PulsoBasal"].ToString()),
                            PulsoMaximo = Convert.ToInt32(Request["PulsoMaximo"].ToString()),
                            Telefono = model.Telefono
                        };

                        XtremBiking.Logica.Usuarios.SavePersonalInfo(modeloDTO);
                        TempData["Message"] = XtremBiking.Recursos.Controladores.Usuarios.SavePersonalInfoSuccess;
                    //}
                    //si el usuario tiene perfil de usuario entonces
                    //llamar a vista que complete la ficha del usuario
                    return RedirectToAction("Index", "Home");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
            }
            return View(model);
        }
        #endregion

        #region Goal Info
        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Usuario)]
        public ActionResult CreateGoal()
        {
            Models.Usuarios.CreateGoal model = new Models.Usuarios.CreateGoal();
            model.Date = DateTime.Now;
            return View(model);
        }


        [MyAuthorization(AccessLevel = XtremBiking.Logica.Enumerados.Usuarios.Perfil.Usuario)]
        [HttpPost]
        public ActionResult CreateGoal(XtremBiking.Web.Models.Usuarios.CreateGoal model, FormCollection collection)
        {

            try
            {

                //decimal altura = Convert.ToDecimal(Request["Altura"].ToString());
                //double peso = Convert.ToDouble(Request["Peso"].ToString());
                //model.Altura.ToString().Replace(".",",");// = Convert.ToDecimal(Request["Altura"].ToString());
                //model.Peso.ToString().Replace(".",",");// = Convert.ToDecimal(Request["Altura"].ToString());
                //int time = Convert.ToInt32(Request["txtYear"].ToString());

                if (ModelState.IsValid)
                {

                    String[] s = User.Identity.Name.Split(new Char[] { '#' });
                    long userId = long.Parse(s[0]);


                    XtremBiking.Logica.DTO.UserGoal modeloDTO = new Logica.DTO.UserGoal()
                    {
                        IdUser = userId,
                        Description = model.Description,
                        Date = model.Date
                    };

                
                //XtremBiking.Logica.DTO.PersonalInfo modeloDTO = new Logica.DTO.PersonalInfo()
                //{
                //    IdUsuario = userId,
                //    Altura = float.Parse(collection["Altura"].ToString().Replace(".", ",")),
                //    Celular = model.Celular,
                //    Competencias = model.Competencias,
                //    Direccion = model.Direccion,
                //    Documento = model.Documento,
                //    FechaNacimiento = model.FechaNacimiento,
                //    KmsRecorridos = Convert.ToInt32(Request["KmsRecorridos"].ToString()),
                //    Peso = float.Parse(collection["Peso"].ToString().Replace(".", ",")),
                //    PorQueCiclismo = model.PorQueCiclismo,
                //    PulsoBasal = Convert.ToInt32(Request["PulsoBasal"].ToString()),
                //    PulsoMaximo = Convert.ToInt32(Request["PulsoMaximo"].ToString()),
                //    Telefono = model.Telefono
                //};

                    XtremBiking.Logica.Usuarios.SaveGoal(modeloDTO);
                //OJO HACER METODO QUE MANDE EMAIL INFORMANDO DEL REGISTRO DE NUEVO OBJETIVO

                    TempData["Message"] = XtremBiking.Recursos.Controladores.Usuarios.SaveGoalSuccess;
                }
                //si el usuario tiene perfil de usuario entonces
                //llamar a vista que complete la ficha del usuario
                return RedirectToAction("Index", "Home");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
            }
            return View(model);
        }

        #endregion
    }
}
